package pl.cezary.butler.walili.server.db.tasks;

import pl.cezary.butler.walili.server.ServerTask;
import pl.cezary.butler.walili.common.Query;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import pl.cezary.butler.walili.server.db.Queries;
import pl.cezary.butler.walili.server.db.tables.ZadPolozenie;
import pl.cezary.butler.walili.server.db.tables.ZadReszta;

/**
 * Implementacja pobierania zadan z bd na podstawie zapytania
 *
 * @author Cezary Butler
 *
 * TODO niezbedne poprawienie nazw kolumn w bd, ewentualnie skladni sql'a
 *
 */
public class GetTasksTask extends FetchingTask<List<ServerTask>> {

    private static final Logger log = Logger.getLogger(GetTasksTask.class.getName());
    private final Query zapytanie;
    private List<ServerTask> wynik;
    //TODO getTasksUser powinno ograniczać max liczbę pobranych zadań tutaj program powinien móc pobrać choćby wszystkie
    public GetTasksTask(Query polozenie) {
        zapytanie = polozenie;
    }
    //<editor-fold defaultstate="collapsed" desc=" CZĘŚĆ NARZĘDZIOWA "> 
    private boolean firstArg = true;

    private String getConcatString() {
        if (firstArg) {
            firstArg = false;
            return " WHERE ";
        } else {
            return " AND ";
        }
    }
    //</editor-fold>

    @Override
    public void executeInternal() throws SQLException {
        final int limit = zapytanie.getLimit();
        //int localLimit=(limit>0)?Math.min(limit,10000):10000;
        final int localLimit = limit;
        StringBuilder builder = new StringBuilder(Queries.SELECT_ZADANIE.getQuery());
        if (!zapytanie.getTarget().isEmpty()) {
            builder.append(getConcatString()).append(ZadReszta.cel).append(" like '").append(zapytanie.getTarget()).append('\'');
        }
        if (!zapytanie.getLocation().isEmpty()) {
            builder.append(getConcatString()).append(ZadPolozenie.polozenie).append(" like '").append(zapytanie.getLocation()).append('\'');
        }
        if (zapytanie.getStatus() != null) {
            builder.append(getConcatString()).append(ZadReszta.status).append(" = ").append(zapytanie.getStatus().ordinal());
        }
        if(localLimit>0){
            builder.append(" LIMIT ").append(limit);
        }
        final String sqlQuery = builder.toString();
        log.log(Level.FINE, "Query fetching tasks {0}", sqlQuery);
        wynik = getJdbcTemplate().query(sqlQuery, TaskRowMapper.getInstance() );
    }

    @Override
    protected List<ServerTask> $getResultsNonLocking() {
        return wynik;
    }
}
